﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CMS_GYM.Interface
{
    public partial class frmQuanLyKhachHangMoi : frmTemplete1
    {
        #region Attribute
        public clsKhachHangDTO KhachHangInfo = null;
        public double KhuyenMaiDongTruocSauThang;
        public double KhuyenMaiDongTruocMuoiHaiThang;
        public double KhuyenMaiSinhNhatVaDongMuoiHaiKy;
        public int SoNgayTrongThangMacDinh;
        private string KeySearch = null;
        #endregion

        #region Initial
        public frmQuanLyKhachHangMoi()
        {
            InitializeComponent();
            KhoiTaoSuKien();
            LayDanhSachKhachHang();
        }

        public frmQuanLyKhachHangMoi(string _KeySearch)
        {
            InitializeComponent();
            KhoiTaoSuKien();
            LayDanhSachKhachHang();
            txtTimKiem.Text = _KeySearch;
            KeySearch = _KeySearch;
            txtTimKiem_KeyUp(null, null);
            dtgKhachHang.Focus();
        }

        private void KhoiTaoSuKien()
        {
            lblTitle.Text = "QUẢN LÝ KHÁCH HÀNG";
            dtgKhachHang.AutoGenerateColumns = false;
            uct_Reset.Reset.Click += new EventHandler(btn_Reset_Click);
            uct_Save.Save.Click += new EventHandler(btn_Save_Click);
            uct_Refresh.Refresh.Click += new EventHandler(btn_Refresh_Click);
            uct_Delete.Delete.Click += new EventHandler(btn_Delete_Click);
            this.ucFullAddress1.cbProvince1.cbProv.SelectedValueChanged += new EventHandler(cbProv_SelectedValueChanged);
            this.ucFullAddress1.cbDistrict1.cbDist.SelectedValueChanged += new EventHandler(cbDist_SelectedValueChanged);
            this.ucFullAddress1.cbStreet1.cbStrtName.SelectedValueChanged += new EventHandler(cbStrtName_SelectedValueChanged);
            this.ucFullAddress1.cbWard1.cbWardName.SelectedValueChanged += new EventHandler(cbWardName_SelectedValueChanged);
            this.ucFullAddress1.txtAddNo.TextChanged += new EventHandler(txtAddNo_TextChanged);
        }
        #endregion

        #region LayDanhSachKhachHang()
        public void LayDanhSachKhachHang()
        {
            try
            {
                dtgKhachHang.DataSource = null;
                clsKhachHangBUS KhachHangBus = new clsKhachHangBUS();
                DataView dv = new DataView(KhachHangBus.LayBang());
                DataTable dtTmp = dv.ToTable(true, new string[] { "KhachHangId", "MaKhachHang", "HoTen" });
                dtTmp.Columns.Add("HoDem", typeof(string));
                dtTmp.Columns.Add("Ten", typeof(string));
                foreach (DataRow dr in dtTmp.Rows)
                {
                    try
                    {
                        string HoTenKH = dr["HoTen"].ToString().Trim();
                        string Ho = string.Empty;
                        string Dem = string.Empty;
                        string Ten = string.Empty;
                        if (HoTenKH.Contains(" ") == false)
                        {
                            Ten = HoTenKH;
                        }
                        else
                        {
                            Ho = HoTenKH.Substring(0, HoTenKH.IndexOf(" "));
                            Dem = string.Empty;
                            Ten = HoTenKH.Substring(HoTenKH.LastIndexOf(" ") + 1);
                            try
                            {
                                Dem = HoTenKH.Substring(HoTenKH.IndexOf(" ") + 1, HoTenKH.LastIndexOf(" ") - HoTenKH.IndexOf(" ") - 1);
                            }
                            catch
                            {
                                Dem = string.Empty;
                            }
                        }
                        dr["HoDem"] = Ho + " " + Dem;
                        dr["Ten"] = Ten;
                    }
                    catch { }
                }
                dv = new DataView(dtTmp);
                dv.Sort = "HoDem, Ten";
                dtgKhachHang.DataSource = dv;
                txtSoLuongKhachHang.Text = dtgKhachHang.Rows.Count.ToString() + " khách hàng";
            }
            catch { }
        }
        #endregion

        #region Functions
        #region LayThongTinKhachHang(int KhachHangId)
        public void LayThongTinKhachHangBangID(decimal KhachHangId)
        {
            try
            {
                clsKhachHangBUS KhachHangBus = new clsKhachHangBUS();
                KhachHangInfo = KhachHangBus.LayThongTinKhachHang(KhachHangId);
                if (KhachHangInfo != null)
                {
                   
                    //Lay thong tin the
                    KhachHangInfo.CacThe = KhachHangBus.LayDanhSachThe(KhachHangId);
                    //Lay danh sach the
                    gvThe.DataSource = KhachHangBus.LayBangThe(KhachHangId);
                    TaiDuLieuKhachHang(KhachHangInfo);
                    lblSoLuongTheDaThu.Text="Số lượng thẻ đã thanh toán: " + SoLuongTheKhachHangDaThanhToan().ToString();
                    GanCacTheChiChoPhepDoc();
                    //Lay thong tin khuyen mai
                    KhachHangInfo.CacKhuyenMai = KhachHangBus.LayDanhSachKhuyenMaiCuaMotKhachHang(KhachHangInfo.KhachHangId);
                    if (KhachHangInfo.CacKhuyenMai != null && KhachHangInfo.CacKhuyenMai.Count > 0)
                    {
                        for (int i = 0; i < KhachHangInfo.CacKhuyenMai.Count; i++)
                        {
                            cboKhuyenMai.SelectedValue = KhachHangInfo.CacKhuyenMai[i].KhuyenMaiId;
                        }
                    }
                    else
                    {
                        cboKhuyenMai.SelectedIndex = -1;
                    }
                    btnThemThe.Enabled = true;
                }
            }
            catch { }
        }

        #endregion

        private int SoLuongTheKhachHangDaThanhToan()
        {
            int Soluong = 0;
            for (int i = 0; i < gvThe.RowCount; i++)
            {
                if ( gvThe.Rows[i].Cells["IsThuTien"].Value != null
                    && gvThe.Rows[i].Cells["IsThuTien"].Value.ToString() == "Đã thu")
                {
                    Soluong++;
                }
            }
            return Soluong;
        }

        #region TaiDuLieuKhachHang(clsKhachHangDTO KhachHangInfo)
        private void TaiDuLieuKhachHang(clsKhachHangDTO _KhachHangInfo)
        {
            this.txtMaKhachHang.Text = _KhachHangInfo.MaKhachHang;
            this.txtHoTen.Text = _KhachHangInfo.HoTen;
            this.txtMaSoThue.Text = _KhachHangInfo.MaSoThue;
            this.txtdNgaySinh.value = _KhachHangInfo.NgaySinh;
            this.txtSoDT.Text = _KhachHangInfo.SoDienThoai;
            this.ucFullAddress1.setSoNha(_KhachHangInfo.SoNha);
            if(_KhachHangInfo.DuongId!=null)
                this.ucFullAddress1.setDuong(_KhachHangInfo.DuongId.ToString());
            else
                this.ucFullAddress1.setDuong(string.Empty);
            if (_KhachHangInfo.PhuongXaId != null)
                this.ucFullAddress1.setPhuong(_KhachHangInfo.PhuongXaId.ToString());
            else
                this.ucFullAddress1.setPhuong(string.Empty);
            if (_KhachHangInfo.QuanHuyenId != null)
                this.ucFullAddress1.setQuan(_KhachHangInfo.QuanHuyenId.ToString());
            else
                this.ucFullAddress1.setQuan(string.Empty);
            if (_KhachHangInfo.TinhThanhId != null)
                this.ucFullAddress1.setTinhThanh(_KhachHangInfo.TinhThanhId.ToString());    
            else
                this.ucFullAddress1.setQuan(string.Empty);
            this.txtEmail.Text = _KhachHangInfo.Email;
            this.txtDiaChi.Text = _KhachHangInfo.DiaChi;
            this.txtGhiChu.Text = _KhachHangInfo.GhiChu;
            this.grbTheHocVien.Text = "Danh sách thẻ của học viên " + _KhachHangInfo.HoTen.ToString();
            if (_KhachHangInfo.NgaySinh.Date.Month == DateTime.Now.Date.Month)
            {
                int SoTheDaDong = SoLuongTheKhachHangDaThanhToan();
                if (SoTheDaDong >= 12 && KhuyenMaiSinhNhatVaDongMuoiHaiKy > 0)
                {
                    this.lblKhuyenMaiSinhNhat.Text = "KHÁCH HÀNG ĐƯỢC HƯỞNG KHUYẾN MÃI GIẢM " + Math.Round(KhuyenMaiSinhNhatVaDongMuoiHaiKy, 0).ToString() + "% VÀO SINH NHẬT VÌ SỐ THẺ ĐÃ ĐÓNG LÀ " +SoTheDaDong.ToString()+ ".";
                }
                else
                {
                    this.lblKhuyenMaiSinhNhat.Text = string.Empty;
                }
            }
            else
            {
                this.lblKhuyenMaiSinhNhat.Text = string.Empty;
            }
        }
        #endregion

        #region LamTrongDuLieu()
        private void LamTrongDuLieu()
        {
            try
            {
                this.txtHoTen.Text = string.Empty;
                this.txtMaSoThue.Text = string.Empty;
                this.txtdNgaySinh.value = new DateTime();
                this.txtSoDT.Text = string.Empty;
                // this.txtSoNha.Text = string.Empty;
                this.txtEmail.Text = string.Empty;
                this.txtDiaChi.Text = string.Empty;
                this.txtGhiChu.Text = string.Empty;
                this.grbTheHocVien.Text = "Danh sách thẻ học viên";
                this.lblKhuyenMaiSinhNhat.Text = string.Empty;
                this.txtMaKhachHang.Text = new clsKhachHangBUS().LayMaKhachHangMoi();
                this.txtHoTen.Focus();
                KhachHangInfo = null;
                gvThe.DataSource = null;
            }catch (Exception ex)
            { }

        }

        private void GanCacTheChiChoPhepDoc()
        {
            for (int i = 0; i < gvThe.Rows.Count; i++)
            {
                decimal TheId;
                //Kiem tra chua da thu tien thi khong cho phep chinh sua
                if (gvThe.Rows[i].Cells["TheId"].Value != null &&
                    !string.IsNullOrEmpty(gvThe.Rows[i].Cells["TheId"].Value.ToString())
                    && decimal.TryParse(gvThe.Rows[i].Cells["TheId"].Value.ToString(), out TheId)
                    && gvThe.Rows[i].Cells["IsThuTien"].Value != null
                    && gvThe.Rows[i].Cells["IsThuTien"].Value.ToString() == "Đã thu"
                    )
                {
                    //gvThe.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(220, 241, 247);//Color.FromArgb(254, 220, 162);
                    gvThe.Rows[i].ReadOnly = true;
                }
            }
            if (gvThe.Rows.Count > 0)
            {
                gvThe.CurrentCell = gvThe.Rows[gvThe.Rows.Count - 1].Cells["MaThe"];
                gvThe.FirstDisplayedCell = gvThe.Rows[gvThe.Rows.Count - 1].Cells["MaThe"];
            }

        }

        private clsTheDTO KhoiTaoThe(DataGridViewRow Row)
        {
            clsTheDTO The = new clsTheDTO();
            The.TheId = Row.Cells["TheId"].Value == null || string.IsNullOrEmpty(Row.Cells["TheId"].Value.ToString()) ? 0 : decimal.Parse(Row.Cells["TheId"].Value.ToString());
            The.MaThe = Row.Cells["MaThe"].Value == null ? string.Empty : Row.Cells["MaThe"].Value.ToString();
            The.KhachHangId = KhachHangInfo.KhachHangId;
            The.NgayBatDau = DateTime.Parse(Row.Cells["NgayBatDau"].Value.ToString());
            The.NgayKetThuc = DateTime.Parse(Row.Cells["NgayKetThuc"].Value.ToString());
            The.GiaTien = double.Parse(Row.Cells["GiaTien"].Value.ToString());
            The.TienKhuyenMai = double.Parse(Row.Cells["TienKhuyenMai"].Value.ToString());
            The.ThanhTien = double.Parse(Row.Cells["ThanhTien"].Value.ToString());
            The.KhuyenMaiId = Row.Cells["KhuyenMaiId"].Value == null || string.IsNullOrEmpty(Row.Cells["KhuyenMaiId"].Value.ToString()) ? null : (int?)int.Parse(Row.Cells["KhuyenMaiId"].Value.ToString());
            The.MoTa = Row.Cells["MoTa"].Value == null ? string.Empty : Row.Cells["MoTa"].Value.ToString();
            The.NguoiTaoId = clsUser.NhanVienId;
            The.NguoiChinhSuaId = clsUser.NhanVienId;
            The.NgayChinhSua = DateTime.Now;
            return The;
        }

        private bool KiemTraKhoiTaoThe(ref string strError, ref int indexforcus)
        {
            strError = "Lỗi phát sinh: ";
            int count = 0;
            #region Kiểm tra danh sách thẻ trống
            if (gvThe.Rows.Count == 0)
            {
                strError = "\n + Chưa nhập thẻ!";
                return false;
            }
            #endregion

            for (int i = 0; i < gvThe.Rows.Count; i++)
            {
                decimal TheId;
                //Kiem tra chua da thu tien thi khong cho phep chinh sua
                if (!(gvThe.Rows[i].Cells["TheId"].Value != null &&
                    !string.IsNullOrEmpty(gvThe.Rows[i].Cells["TheId"].Value.ToString())
                    && decimal.TryParse(gvThe.Rows[i].Cells["TheId"].Value.ToString(), out TheId)
                    && gvThe.Rows[i].Cells["IsThuTien"].Value != null
                    && gvThe.Rows[i].Cells["IsThuTien"].Value.ToString() == "Đã thu"
                    ))
                {
                    if (KiemTraMotDongThemMoi(i))
                    {
                        #region Kiểm tra ngày
                        DateTime NgayBatDau;
                        if (gvThe.Rows[i].Cells["NgayBatDau"].Value == null
                            || string.IsNullOrEmpty(gvThe.Rows[i].Cells["NgayBatDau"].Value.ToString())
                            || !DateTime.TryParse(gvThe.Rows[i].Cells["NgayBatDau"].Value.ToString(), out NgayBatDau)
                            || NgayBatDau == new DateTime()
                            )
                        {
                            strError += "\n + Ngày bắt đầu ở dòng thứ " + i.ToString() + " không được bỏ trống!";
                            return false;
                        }
                        DateTime NgayKetThuc;
                        if (gvThe.Rows[i].Cells["NgayKetThuc"].Value == null
                            || string.IsNullOrEmpty(gvThe.Rows[i].Cells["NgayKetThuc"].Value.ToString())
                            || !DateTime.TryParse(gvThe.Rows[i].Cells["NgayKetThuc"].Value.ToString(), out NgayKetThuc)
                            || NgayKetThuc == new DateTime()
                            )
                        {
                            strError += "\n + Ngày kết thúc ở dòng thứ " + i.ToString() + " không được bỏ trống!";
                            return false;
                        }

                        if (NgayBatDau.CompareTo(NgayKetThuc) >= 0)
                        {
                            strError += "\n + Ngày bắt đầu phải nhỏ hơn ngày kết thúc ở dòng thứ " + i.ToString() + " không được bỏ trống!";
                            return false;
                        }
                        string strErrorDate=string.Empty;
                        if(!KiemTraNgay(i, ref strErrorDate))
                        {
                             strError += "\n " + strErrorDate;
                        }

                        #endregion

                        #region Kiểm tra tiền
                        double GiaTien;
                        if (gvThe.Rows[i].Cells["GiaTien"].Value == null
                            || string.IsNullOrEmpty(gvThe.Rows[i].Cells["GiaTien"].Value.ToString())
                            || !double.TryParse(gvThe.Rows[i].Cells["GiaTien"].Value.ToString(), out GiaTien)
                            || GiaTien <= 0
                            )
                        {
                            strError += "\n + Giá tiền ở dòng thứ " + i.ToString() + " phải lớn hơn 0!";
                            return false;
                        }

                        double TienKhuyenMai;

                        if (gvThe.Rows[i].Cells["TienKhuyenMai"].Value == null
                            || string.IsNullOrEmpty(gvThe.Rows[i].Cells["TienKhuyenMai"].Value.ToString())
                            || !double.TryParse(gvThe.Rows[i].Cells["TienKhuyenMai"].Value.ToString(), out TienKhuyenMai)
                            || TienKhuyenMai < 0
                            )
                        {
                            strError += "\n + Tiền khuyến mãi ở dòng thứ " + i.ToString() + " lớn hơn hoặc bằng 0!";
                            return false;
                        }
                        double ThanhTien;
                        if (gvThe.Rows[i].Cells["ThanhTien"].Value == null
                            || string.IsNullOrEmpty(gvThe.Rows[i].Cells["ThanhTien"].Value.ToString())
                            || !double.TryParse(gvThe.Rows[i].Cells["ThanhTien"].Value.ToString(), out ThanhTien)
                            || ThanhTien != (GiaTien - TienKhuyenMai)
                            )
                        {
                            strError += "\n + Thành tiền ở dòng thứ " + i.ToString() + " phải bằng (Giá tiền - Tiền khuyến mãi)!";
                            return false;
                        }

                        #endregion
                    }
                    else
                    {
                        if (KiemTraMotDongChinhSua(i))
                        {
                            #region Kiểm tra ngày
                            DateTime NgayBatDau;
                            if (gvThe.Rows[i].Cells["NgayBatDau"].Value == null
                                || string.IsNullOrEmpty(gvThe.Rows[i].Cells["NgayBatDau"].Value.ToString())
                                || !DateTime.TryParse(gvThe.Rows[i].Cells["NgayBatDau"].Value.ToString(), out NgayBatDau)
                                || NgayBatDau == new DateTime()
                                )
                            {
                                strError += "\n + Ngày bắt đầu ở dòng thứ " + i.ToString() + " không được bỏ trống!";
                                return false;
                            }
                            DateTime NgayKetThuc;
                            if (gvThe.Rows[i].Cells["NgayKetThuc"].Value == null
                                || string.IsNullOrEmpty(gvThe.Rows[i].Cells["NgayKetThuc"].Value.ToString())
                                || !DateTime.TryParse(gvThe.Rows[i].Cells["NgayKetThuc"].Value.ToString(), out NgayKetThuc)
                                || NgayKetThuc == new DateTime()
                                )
                            {
                                strError += "\n + Ngày kết thúc ở dòng thứ " + i.ToString() + " không được bỏ trống!";
                                return false;
                            }

                            if (NgayBatDau.CompareTo(NgayKetThuc) >= 0)
                            {
                                strError += "\n + Ngày bắt đầu phải nhỏ hơn ngày kết thúc ở dòng thứ " + i.ToString() + " không được bỏ trống!";
                                return false;
                            }
                            string strErrorDate = string.Empty;
                            if (!KiemTraNgay(i, ref strErrorDate))
                            {
                                strError += "\n " + strErrorDate;
                            }

                            #endregion

                            #region Kiểm tra tiền
                            double GiaTien;
                            if (gvThe.Rows[i].Cells["GiaTien"].Value == null
                                || string.IsNullOrEmpty(gvThe.Rows[i].Cells["GiaTien"].Value.ToString())
                                || !double.TryParse(gvThe.Rows[i].Cells["GiaTien"].Value.ToString(), out GiaTien)
                                || GiaTien <= 0
                                )
                            {
                                strError += "\n + Giá tiền ở dòng thứ " + i.ToString() + " phải lớn hơn 0!";
                                return false;
                            }

                            double TienKhuyenMai;

                            if (gvThe.Rows[i].Cells["TienKhuyenMai"].Value == null
                                || string.IsNullOrEmpty(gvThe.Rows[i].Cells["TienKhuyenMai"].Value.ToString())
                                || !double.TryParse(gvThe.Rows[i].Cells["TienKhuyenMai"].Value.ToString(), out TienKhuyenMai)
                                || TienKhuyenMai < 0
                                )
                            {
                                strError += "\n + Tiền khuyến mãi ở dòng thứ " + i.ToString() + " lớn hơn hoặc bằng 0!";
                                return false;
                            }
                            if (TienKhuyenMai >= GiaTien)
                            {
                                strError += "\n + 'Giá tiền' nhỏ hơn 'tiền khuyến mãi' ở dòng thứ " + i.ToString() + "!";
                                return false;
                            }
                            double ThanhTien;
                            if (gvThe.Rows[i].Cells["ThanhTien"].Value == null
                                || string.IsNullOrEmpty(gvThe.Rows[i].Cells["ThanhTien"].Value.ToString())
                                || !double.TryParse(gvThe.Rows[i].Cells["ThanhTien"].Value.ToString(), out ThanhTien)
                                || ThanhTien != (GiaTien - TienKhuyenMai)
                                )
                            {
                                strError += "\n + Thành tiền ở dòng thứ " + i.ToString() + " phải bằng (Giá tiền - Tiền khuyến mãi)!";
                                return false;
                            }

                            #endregion
                        }
                    }
                }
                else
                {
                    count++;
                }
            }
            if (count == gvThe.Rows.Count)
            {
                strError = "\n + Danh sách thẻ không thay đổi!";
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Kiem tra co su thay doi cac the (True: có thay doi, False: Khong thay doi)
        /// </summary>
        /// <returns></returns>
        private bool KiemTraCoDongChinhSua()
        {
            for (int i = 0; i < gvThe.Rows.Count; i++)
            {
                if (KiemTraMotDongChinhSua(i))
                {
                    return true;
                }
            }
            return false;
        }

        private bool KiemTraMotDongChinhSua(int dong)
        {
            decimal TheId;
            //Kiem tra chua da thu tien thi khong cho phep chinh sua
            if (gvThe.Rows[dong].Cells["TheId"].Value != null &&
                !string.IsNullOrEmpty(gvThe.Rows[dong].Cells["TheId"].Value.ToString())
                && decimal.TryParse(gvThe.Rows[dong].Cells["TheId"].Value.ToString(), out TheId)
                && gvThe.Rows[dong].Cells["IsThuTien"].Value != null
                && gvThe.Rows[dong].Cells["IsThuTien"].Value.ToString() == "Chưa thu"
                )
            {
                for (int i = 0; i < KhachHangInfo.CacThe.Count; i++)
                {
                    if (TheId == KhachHangInfo.CacThe[i].TheId)
                    {
                        string MoTa = gvThe.Rows[dong].Cells["MoTa"].Value == null ? string.Empty : gvThe.Rows[dong].Cells["MoTa"].Value.ToString();
                        if (gvThe.Rows[dong].Cells["NgayBatDau"].Value.ToString().Trim() != KhachHangInfo.CacThe[i].NgayBatDau.ToString().Trim()
                            || gvThe.Rows[dong].Cells["NgayKetThuc"].Value.ToString().Trim() != KhachHangInfo.CacThe[i].NgayKetThuc.ToString().Trim()
                            || double.Parse(gvThe.Rows[dong].Cells["GiaTien"].Value.ToString().Trim()) != KhachHangInfo.CacThe[i].GiaTien
                            || double.Parse(gvThe.Rows[dong].Cells["TienKhuyenMai"].Value.ToString().Trim()) != KhachHangInfo.CacThe[i].TienKhuyenMai
                            || MoTa != KhachHangInfo.CacThe[i].MoTa
                            )
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }

            }
            return false;
        }

        /// <summary>
        /// Kiem tra co dong them moi (True: Co dong them moi; False: Khong co dong them moi)
        /// </summary>
        /// <returns></returns>
        private bool KiemTraCoDongThemMoi()
        {
            for (int i = 0; i < gvThe.Rows.Count; i++)
            {
                if (KiemTraMotDongThemMoi(i))
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// Kiem tra mot dong them moi (True: Co dong them moi, False: Khong co dong them moi)
        /// </summary>
        /// <param name="dong"></param>
        /// <returns></returns>
        private bool KiemTraMotDongThemMoi(int dong)
        {
            decimal TheId;
            //Kiem tra chua da thu tien thi khong cho phep chinh sua
            if (gvThe.Rows[dong].Cells["TheId"].Value == null
                || string.IsNullOrEmpty(gvThe.Rows[dong].Cells["TheId"].Value.ToString())
                || !decimal.TryParse(gvThe.Rows[dong].Cells["TheId"].Value.ToString(), out TheId))
            {
                return true;
            }
            return false;
        }

        #endregion

        private void LoadComboBoxLoaiKhachHang()
        {
            DataTable TableLKH =new clsLoaiKhachHangBUS().LayBang();
            cboLoaiKhachHang.DataSource = TableLKH;
            cboLoaiKhachHang.DisplayMember = "TenLoaiKhachHang";
            cboLoaiKhachHang.ValueMember = "LoaiKhachHangId";
        }

        private clsKhachHangDTO KhoiTaoKhachHang(ref string Error)
        {
            try
            {
                clsKhachHangDTO KhachHang = new clsKhachHangDTO();
                KhachHang.MaKhachHang = txtMaKhachHang.Text.Trim();
                KhachHang.HoTen = txtHoTen.Text;
                KhachHang.NgaySinh = txtdNgaySinh.value;
                KhachHang.SoDienThoai = txtSoDT.Text;
                KhachHang.Email = txtEmail.Text;
                KhachHang.MaSoThue = txtMaSoThue.Text;
                KhachHang.GhiChu = txtGhiChu.Text;
                KhachHang.DiaChi = txtDiaChi.Text;
                KhachHang.LoaiKhachHangId = int.Parse(cboLoaiKhachHang.SelectedValue.ToString());
                KhachHang.SoNha = string.IsNullOrEmpty(ucFullAddress1.DiaChi) || ucFullAddress1.DiaChi == "Nhập số nhà" ? string.Empty : ucFullAddress1.DiaChi;
                KhachHang.DuongId = ucFullAddress1.ID_Duong == null || ucFullAddress1.ID_Duong == 0 ? null : (int?)ucFullAddress1.ID_Duong;
                KhachHang.PhuongXaId = ucFullAddress1.ID_Phuong == null || ucFullAddress1.ID_Phuong == 0 ? null : (int?)ucFullAddress1.ID_Phuong;
                KhachHang.QuanHuyenId = ucFullAddress1.ID_Quan == null || ucFullAddress1.ID_Quan == 0 ? null : (int?)ucFullAddress1.ID_Quan;
                KhachHang.TinhThanhId = ucFullAddress1.ID_TP == null || ucFullAddress1.ID_TP == 0 ? null : (int?)ucFullAddress1.ID_TP;
                KhachHang.GhiChu = txtGhiChu.Text;
                KhachHang.NguoiTaoId = clsUser.NhanVienId;
                KhachHang.NguoiChinhSuaId = clsUser.NhanVienId;
                KhachHang.NgayChinhSua = DateTime.Now;
                int KhuyenMaiId;
                if (cboKhuyenMai.SelectedValue != null && !string.IsNullOrEmpty(cboKhuyenMai.SelectedValue.ToString()) && int.TryParse(cboKhuyenMai.SelectedValue.ToString(), out KhuyenMaiId))
                {
                    clsKhuyenMaiDTO KhuyeMai = new clsKhuyenMaiDTO();
                    KhuyeMai.KhuyenMaiId = KhuyenMaiId;
                    KhuyeMai.TenKhuyenMai = cboKhuyenMai.SelectedText;
                    KhachHang.CacKhuyenMai.Add(KhuyeMai);
                }
                return KhachHang;
            }
            catch (Exception ex)
            {
                return null;
            }

        }

        private bool KiemTraKhoiTaoKhacHang(ref string strError, ref int indexforcus)
        {
            strError = "Lỗi phát sinh: ";

            #region Kiểm tra tên khách hàng
            //Kiểm tra Tên khách hàng 
            string MA_TB = txtMaKhachHang.Text;
            if (string.IsNullOrEmpty(MA_TB) || MA_TB.Trim() == "")
            {
                strError += "\n + Vui lòng nhập thông tin khách hàng để thêm mới (nhấn nút mới) hoặc chọn khách hàng để chỉnh sửa!";
                indexforcus = 9;
                return false;
            }
            else
            {
                if (!(MA_TB.Trim().Substring(0, 2) == "TH"))
                {
                    strError += "\n + Đây là khách hàng cầu lông nên không được phép chỉnh sửa!";
                    indexforcus = 9;
                    return false;
                }
            }
            #endregion

            #region Kiểm tra tên khách hàng
            //Kiểm tra Tên khách hàng 
            string TEN_TB = txtHoTen.Text;
            if (string.IsNullOrEmpty(TEN_TB) || TEN_TB.Trim() == "")
            {
                strError += "\n + Tên khách hàng không được bỏ trống!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra ngày sinh
            //Kiểm tra Tên khách hàng 
            if (txtdNgaySinh.value == null || txtdNgaySinh.value==new DateTime())
            {
                strError += "\n + Ngày sinh không được bỏ trống!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra loại khách hàng
            //Kiểm tra định dạng số phiếu chi
            int LoaiKhachHangId;
            if (cboLoaiKhachHang.SelectedValue ==null || string.IsNullOrEmpty(cboLoaiKhachHang.SelectedValue.ToString()) || !int.TryParse(cboLoaiKhachHang.SelectedValue.ToString(),out LoaiKhachHangId))
            {
                strError += "\n + Loại khách hàng bắt buộc chọn";
                indexforcus = 9;
                return false;
            }
            #endregion

            return true;
        }

        /// <summary>
        /// Kiem tra thay doi khuyên mai (True: Co thay doi, False: Khong thay doi)
        /// </summary>
        /// <returns></returns>
        private bool KiemTraThayDoiKhuyenMai()
        {
            KhachHangInfo.CacKhuyenMai = new clsKhachHangBUS().LayDanhSachKhuyenMaiCuaMotKhachHang(KhachHangInfo.KhachHangId);
            int KhuyenMaiID; 
            if (KhachHangInfo.CacKhuyenMai != null && KhachHangInfo.CacKhuyenMai.Count > 0)//Khach hang co khuyen mai trươc do
            {   
                if(cboKhuyenMai.SelectedValue ==null 
                    || string.IsNullOrEmpty(cboKhuyenMai.SelectedValue.ToString()) 
                    || !int.TryParse(cboKhuyenMai.SelectedValue.ToString(),out KhuyenMaiID))
                {
                    return true;
                }
                else
                {
                    for (int i = 0; i < KhachHangInfo.CacKhuyenMai.Count; i++)
                    {

                        if (KhachHangInfo.CacKhuyenMai[i].KhuyenMaiId == KhuyenMaiID)
                        {
                            return false;
                        }
                    }
                    return true;
                }
            }
            else//Khach hang khong co khuyen mai trươc do
            {
                if(cboKhuyenMai.SelectedValue ==null 
                    || string.IsNullOrEmpty(cboKhuyenMai.SelectedValue.ToString()) 
                    || !int.TryParse(cboKhuyenMai.SelectedValue.ToString(),out KhuyenMaiID))//Khong cho khuyen mai
                {
                    return false;//Khong thay doi
                }
                else//Co chon khuyen mai
                {
                    return true;//Thay doi
                }
            }
        }

        private void SaoChep(clsKhachHangDTO KhachHang)
        {
            if(KhachHangInfo!=null)
            {
                KhachHangInfo.MaKhachHang = KhachHang.MaKhachHang;
                KhachHangInfo.HoTen = KhachHang.HoTen;
                KhachHangInfo.NgaySinh = KhachHang.NgaySinh;
                KhachHangInfo.SoDienThoai = KhachHang.SoDienThoai;
                KhachHangInfo.Email = KhachHang.Email;
                KhachHangInfo.MaSoThue =KhachHang.MaSoThue;
                KhachHangInfo.GhiChu =KhachHang.GhiChu;
                KhachHangInfo.DiaChi = KhachHang.DiaChi;
                //KhachHangInfo.LoaiKhachHangId =  KhachHangInfo.LoaiKhachHangId ;
                KhachHangInfo.SoNha = KhachHang.SoNha;
                KhachHangInfo.DuongId = KhachHang.DuongId;
                KhachHangInfo.PhuongXaId = KhachHang.PhuongXaId;
                KhachHangInfo.QuanHuyenId = KhachHang.QuanHuyenId ;
                KhachHangInfo.TinhThanhId = KhachHang.TinhThanhId;
                KhachHangInfo.GhiChu = KhachHang.GhiChu;
                KhachHangInfo.NguoiTaoId = KhachHang.NguoiTaoId;
                KhachHangInfo.NguoiChinhSuaId = KhachHang.NguoiChinhSuaId;
                KhachHangInfo.NgayChinhSua = KhachHang.NgayChinhSua;
                KhachHangInfo.CacKhuyenMai=KhachHang.CacKhuyenMai;
            }
        }

        private void SetPermission()
        {
            uct_Reset.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyKhachHang").ChucNang.Them;
            uct_Save.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyKhachHang").ChucNang.Them ||clsUser.LayThongTinPhanQuyen("QuanLyKhachHang").ChucNang.Sua? true:false;
            uct_Delete.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyKhachHang").ChucNang.Xoa;
            btnThemThe.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyTheHocVien").ChucNang.Them;
            btnLuuThe.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyTheHocVien").ChucNang.Them|| clsUser.LayThongTinPhanQuyen("QuanLyTheHocVien").ChucNang.Sua? true:false;
            btnXoaThe.Enabled = clsUser.LayThongTinPhanQuyen("QuanLyTheHocVien").ChucNang.Xoa;
        }

        #endregion

        #region Events

        // Hàm bắt sự kiện nhấn một phím trên Form. CTRL + ....
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            bool bKetQua = false;
            try
            {

                //------------------------------------
                if (keyData == Keys.Escape )
                {
                    this.Close();
                    bKetQua = true;
                }
                else if ((keyData == (Keys.Control | Keys.W)))
                {
                    dtgKhachHang_CellDoubleClick(null, null);
                }
                else if (keyData == (Keys.Control | Keys.S))
                {
                    btn_Save_Click(null, null);
                }
                else if (keyData == Keys.F5)
                {
                   btn_Reset_Click(null, null);
                }
                else
                    // bKetQua = base.ProcessCmdKey(ref msg, keyData);
                    bKetQua = false;
                return bKetQua;
            }
            catch (Exception) { }

            return bKetQua;
        }

        #region btn_Reset_Click(object sender, EventArgs e)
        private void btn_Reset_Click(object sender, EventArgs e)
        {
            LamTrongDuLieu();
        }
        #endregion

        #region btn_Delete_Click(object sender, EventArgs e)
        private void btn_Delete_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult result = MessageBox.Show("Bạn có thật sự muốn xóa khách hàng hay không?", "Xác nhận thông tin", MessageBoxButtons.YesNo);
                if (result == DialogResult.No)
                {
                    return;
                }
                if (KhachHangInfo != null)
                {
                    if (new clsKhachHangBUS().XoaTamThoi(KhachHangInfo.KhachHangId))
                    {
                        MessageBox.Show("Xóa khách hàng thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        LayDanhSachKhachHang();
                        KhachHangInfo = null;
                        LamTrongDuLieu();
                    }
                    else
                    {
                        MessageBox.Show("Xóa khách hàng không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("Chọn khách hàng cần xóa", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (Exception)
            { }
        }
        #endregion

        #region btn_Save_Click(object sender, EventArgs e)
        private void btn_Save_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                int indexforcus = 0;
                #region Thêm khách hàng
                DialogResult result = MessageBox.Show("Bạn có thật sự muốn " + (KhachHangInfo==null? "thêm": "lưu") + " khách hàng hay không?", "Xác nhận thông tin", MessageBoxButtons.YesNo);
                if (result == DialogResult.No)
                {
                    return;
                }
                if (KiemTraKhoiTaoKhacHang(ref Error, ref indexforcus))
                {
                    clsKhachHangDTO KhachHang = KhoiTaoKhachHang(ref  Error);
                    if (!new clsKhachHangBUS().KiemTraTonTai(KhachHang.MaKhachHang))//Khách hàng không tồn tại
                    {
                        if (clsUser.LayThongTinPhanQuyen("QuanLyKhachHang").ChucNang.Them)
                        {
                        #region Thêm khách hàng
                        try
                        {
                            CSQLServer.BeginTran();
                            if (new clsKhachHangBUS().Them(ref KhachHang, ref Error))
                            {
                                bool Flag = true;
                                if (KhachHang.CacKhuyenMai.Count > 0)
                                {
                                    //Them mot khuyen mai cho khach hang
                                    if (!new clsKhachHangBUS().ThemKhuyenMai(KhachHang, KhachHang.CacKhuyenMai[0]))
                                    {
                                        Flag = false;
                                    }
                                }
                                if (Flag)
                                {
                                    CSQLServer.Commit();
                                    MessageBox.Show("Thêm khách hàng thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    LayDanhSachKhachHang();
                                    LamTrongDuLieu();
                                }
                                else
                                {
                                    CSQLServer.RollBack();
                                    MessageBox.Show("Thêm khuyến mãi cho khách hàng không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Thêm khách hàng không thành công nguyên nhân do " + Error + "!", "Quản lý khách hàng", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        #endregion
                        }
                        else
                        {
                            MessageBox.Show("Bạn không có quyền thêm khách hàng", "Quản lý khách hàng", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        }
                    }
                    else//Khách hàng đã tồn tại
                    {
                        if (KhachHangInfo != null)
                        {
                            if (clsUser.LayThongTinPhanQuyen("QuanLyKhachHang").ChucNang.Sua)
                            {
                                #region Lưu khách hàng
                                try
                                {
                                    bool CoThayDoiKM = KiemTraThayDoiKhuyenMai();
                                    KhachHang.KhachHangId = KhachHangInfo.KhachHangId;
                                    CSQLServer.BeginTran();
                                    if (new clsKhachHangBUS().Sua(KhachHang))
                                    {
                                        bool Flag = true;
                                        //Kiem tra khuyen mai co thay doi khong
                                        if (CoThayDoiKM == true)
                                        {
                                            if (KhachHangInfo.CacKhuyenMai != null)
                                            {
                                                for (int k = 0; k < KhachHangInfo.CacKhuyenMai.Count; k++)
                                                {
                                                    //Ket thuc mot khuyen mai cho khach hang
                                                    if (!new clsKhachHangBUS().KetThucKhuyenMai(KhachHang, KhachHangInfo.CacKhuyenMai[k]))
                                                    {
                                                        Flag = false;
                                                    }
                                                }
                                            }
                                            if (KhachHang.CacKhuyenMai.Count > 0)
                                            {
                                                //Them mot khuyen mai cho khach hang
                                                if (!new clsKhachHangBUS().ThemKhuyenMai(KhachHang, KhachHang.CacKhuyenMai[0]))
                                                {
                                                    Flag = false;
                                                }
                                            }
                                        }
                                        if (Flag)
                                        {
                                            CSQLServer.Commit();
                                            MessageBox.Show("Lưu khách hàng thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                            SaoChep(KhachHang);
                                            //LamTrongDuLieu();
                                        }
                                        else
                                        {
                                            CSQLServer.RollBack();
                                            MessageBox.Show("Thêm khuyến mãi cho khách hàng không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        }
                                    }
                                    else
                                    {
                                        CSQLServer.RollBack();
                                        MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    CSQLServer.RollBack();
                                    MessageBox.Show("Lưu khách hàng không thành công nguyên nhân do " + Error + "!", "Quản lý khách hàng", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                #endregion
                            }
                            else
                            {
                                MessageBox.Show("Bạn không có quyền chỉnh sửa khách hàng", "Quản lý khách hàng", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            }

                        }
                        else
                        {
                            MessageBox.Show("Không lấy được thông tin khách hàng cần chỉnh sửa!", "Quản lý khách hàng", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                else
                {
                    MessageBox.Show(Error, "Quản lý khách hàng", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    //SetFocus(9);
                }
                #endregion
            }
            catch (Exception ex)
            {

            }
        }
        #endregion

        #region btn_Refresh_Click(object sender, EventArgs e)
        private void btn_Refresh_Click(object sender, EventArgs e)
        {
            //LoadData();
            LayDanhSachKhachHang();
        }
        #endregion

        #region txtTimKiem_KeyUp(object sender, KeyEventArgs e)
        private void txtTimKiem_KeyUp(object sender, KeyEventArgs e)
        {
            try
            {
                string search = txtTimKiem.Text.Trim();
                DataView dv = (DataView)dtgKhachHang.DataSource;
                if (search == string.Empty) dv.RowFilter = string.Empty;
                else dv.RowFilter = "MaKhachHang like '%" + search + "%' or HoTen like '%" + search + "%' or HoDem like '%" + search + "%' or Ten like '%" + search + "%'";
                txtSoLuongKhachHang.Text = dtgKhachHang.Rows.Count.ToString() + " khách hàng";
            }
            catch { }
        }
        #endregion

        #region dtgKhachHang_RowEnter(object sender, DataGridViewCellEventArgs e)
        private void dtgKhachHang_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                LayThongTinKhachHangBangID(decimal.Parse(dtgKhachHang.SelectedRows[0].Cells["IdKhachHang"].Value.ToString()));
            }
            catch { }
        }
        #endregion

        #region dtgKhachHang_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        private void dtgKhachHang_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (dtgKhachHang.SelectedRows != null)
                {
                    LayThongTinKhachHangBangID(int.Parse(dtgKhachHang.SelectedRows[0].Cells["IdKhachHang"].Value.ToString()));
                    if (KeySearch != null)
                    {
                        this.Close();
                    }
                }
            }
            catch { }
        }
        #endregion

        #region frmQuanLyKhachHangMoi_Load(object sender, EventArgs e)
        private void frmQuanLyKhachHangMoi_Load(object sender, EventArgs e)
        {
            try
            {
                gvThe.AutoGenerateColumns = false;
                ucFullAddress1.LoadData();
                DataTable TableKhuyenMai = new clsKhuyenMaiBUS().LayBangConApDung();
                cboKhuyenMai.DataSource = KhoiTaoBangKhuyenMai(TableKhuyenMai);
                cboKhuyenMai.DisplayMember = "TenKhuyenMai";
                cboKhuyenMai.ValueMember = "KhuyenMaiId";
                LoadComboBoxLoaiKhachHang();
                this.txtMaKhachHang.Text = new clsKhachHangBUS().LayMaKhachHangMoi();
                try
                {
                    //Lay chuong trinh khuyen mai mac dinh
                    clsKhuyenMaiBUS KhuyenMaiBus = new clsKhuyenMaiBUS();
                    KhuyenMaiDongTruocSauThang = KhuyenMaiBus.KhuyenMaiDongTruocSauThang();
                    KhuyenMaiDongTruocMuoiHaiThang = KhuyenMaiBus.KhuyenMaiDongTruocMuoiHaiThang();
                    KhuyenMaiSinhNhatVaDongMuoiHaiKy = KhuyenMaiBus.KhuyenMaiSinhNhatVaDongMuoiHaiKy();
                    SoNgayTrongThangMacDinh = new clsCongTyBUS().SoNgayMacDinhTrongMotThang();
                }
                catch (Exception)
                {
                    KhuyenMaiDongTruocSauThang = 0;
                    KhuyenMaiDongTruocMuoiHaiThang = 0;
                    KhuyenMaiSinhNhatVaDongMuoiHaiKy = 0;
                    MessageBox.Show("Không lấy được thông tin khuyến mãi của hệ thống!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (Exception)
            { }
            SetPermission();
        }

        private DataView KhoiTaoBangKhuyenMai(DataTable TableKhuyenMai)
        {
            try
            {
                if (TableKhuyenMai != null)
                {
                    TableKhuyenMai.Columns.Remove("MaKhuyenMai");
                    TableKhuyenMai.Columns.Remove("MoTa");
                    TableKhuyenMai.Columns.Remove("SoThuTu");
                    TableKhuyenMai.Columns.Remove("TrangThai");
                    TableKhuyenMai.Columns.Remove("IsLock");
                    TableKhuyenMai.Columns.Remove("NguoiTaoId");
                    TableKhuyenMai.Columns.Remove("NgayTao");
                    TableKhuyenMai.Columns.Remove("NguoiChinhSuaId");
                    TableKhuyenMai.Columns.Remove("NgayChinhSua");
                    object[] M = new object[] { null, null, null, null, null, null };
                    TableKhuyenMai.Rows.Add(M);
                    DataView view = new DataView(TableKhuyenMai);
                    view.Sort = "KhuyenMaiId";
                    return view;
                }
                else
                {
                    return null;
                }
            }
            catch(Exception)
            { return null; }
           
        }
        #endregion

        void txtAddNo_TextChanged(object sender, EventArgs e)
        {
            txtDiaChi.Text = this.ucFullAddress1.getFullAddress();
        }

        public void cbStrtName_SelectedValueChanged(object sender, EventArgs e)
        {
            try
            {
                txtDiaChi.Text = this.ucFullAddress1.getFullAddress();
            }
            catch (Exception) { }
        }

        public void cbDist_SelectedValueChanged(object sender, EventArgs e)
        {
            try
            {
                txtDiaChi.Text = this.ucFullAddress1.getFullAddress();
            }
            catch (Exception) { }
        }

        public void cbProv_SelectedValueChanged(object sender, EventArgs e)
        {
            try
            {
                txtDiaChi.Text = this.ucFullAddress1.getFullAddress();
            }
            catch (Exception) { }
        }

        public void cbWardName_SelectedValueChanged(object sender, EventArgs e)
        {
            try
            {
                txtDiaChi.Text = this.ucFullAddress1.getFullAddress();
            }
            catch (Exception) { }
        }

        private void btnThemThe_Click(object sender, EventArgs e)
        {
            try
            {
                DataTable TableThe = (DataTable)gvThe.DataSource;
                DataRow Row = TableThe.NewRow();
                Row["MaThe"] = new clsTheBUS().LayMaTheMoi();
                double GiaTien = new clsCongTyBUS().GiaTheHinhTheoThang();
                Row["GiaTien"] = GiaTien;
                Row["NgayBatDau"] = DateTime.Now;
                Row["NgayKetThuc"] = DateTime.Now.AddDays(SoNgayTrongThangMacDinh-1);
                Row["SoNgay"] = SoNgayTrongThangMacDinh;
                Row["MoTa"] = "";

                #region Tinh Khuyen mai neu co
                double TienKhuyenMai = 0;
                if (KhachHangInfo != null && KhachHangInfo.CacKhuyenMai.Count > 0)
                {
                    if (KhachHangInfo.CacKhuyenMai[0].PhanTram > 0)
                    {
                        TienKhuyenMai = Math.Round((GiaTien * KhachHangInfo.CacKhuyenMai[0].PhanTram) / 100, 0);
                    }
                    else
                    {
                        TienKhuyenMai = KhachHangInfo.CacKhuyenMai[0].SoTien;
                    }
                    if (TienKhuyenMai > 0)
                    {
                        Row["KhuyenMaiId"] = KhachHangInfo.CacKhuyenMai[0].KhuyenMaiId;
                        Row["MoTa"] = KhachHangInfo.CacKhuyenMai[0].TenKhuyenMai;
                    }
                }
                #endregion

                #region Tinh chiet khau neu co
                double TienKhuyenMaiSinhNhat = 0;
                if (KhachHangInfo.NgaySinh.Date.Month == DateTime.Now.Date.Month && SoLuongTheKhachHangDaThanhToan()>=12)
                {
                    TienKhuyenMaiSinhNhat =  Math.Round((GiaTien * KhuyenMaiSinhNhatVaDongMuoiHaiKy) / 100, 0);
                    //Kiem tra neu khach hang duoc huong cung mot luc 2 chinh sach khuyen mai thi khuyen mai nao co so tien lơn hon thi duoc huong
                    if (TienKhuyenMaiSinhNhat > TienKhuyenMai)
                    {
                        TienKhuyenMai = TienKhuyenMaiSinhNhat;
                        Row["MoTa"] = "Khuyến mãi sinh nhật và đã đóng tiền hơn 12 kỳ";
                    }
                }
                #endregion

                Row["TienKhuyenMai"] = TienKhuyenMai;
                Row["ThanhTien"] = GiaTien - TienKhuyenMai;
                TableThe.Rows.Add(Row);
                btnThemThe.Enabled = false;
            }
            catch (Exception ex)
            { }
        }

        private void CapNhatSoTienTheoNgayNhap( int row, int SoNgay)
        {
            double DonGia = new clsCongTyBUS().GiaTheHinhTheoThang();
            double GiaTien = Math.Round((SoNgay * DonGia) / SoNgayTrongThangMacDinh, 0);
            gvThe.Rows[row].Cells["GiaTien"].Value = GiaTien;
            gvThe.Rows[row].Cells["SoNgay"].Value = SoNgay;

            double TienKhuyenMai = 0;
            Boolean FlagKhuyenMaiDongTruoc = false;
            #region Tinh Khuyen dong truoc 6 hoặc 12 tháng
            if (SoNgay >= SoNgayTrongThangMacDinh * 6)
            {
                if (SoNgay < SoNgayTrongThangMacDinh * 12)
                {
                    if (KhuyenMaiDongTruocSauThang > 0)
                    {
                        TienKhuyenMai = KhuyenMaiDongTruocSauThang;
                        gvThe.Rows[row].Cells["MoTa"].Value = "Khuyến mãi đóng trước 6 tháng.";
                        gvThe.Rows[row].Cells["KhuyenMaiId"].Value = 5;//KhuyenMaiId=5 la Khuyến mãi đóng phí dài hạn 6 tháng
                        FlagKhuyenMaiDongTruoc = true;
                    }
                }
                else
                {
                    if (KhuyenMaiDongTruocMuoiHaiThang > 0)
                    {
                        TienKhuyenMai = KhuyenMaiDongTruocMuoiHaiThang;
                        gvThe.Rows[row].Cells["MoTa"].Value = "Khuyến mãi đóng trước 12 tháng.";
                        gvThe.Rows[row].Cells["KhuyenMaiId"].Value = 6;//KhuyenMaiId=5 la Khuyến mãi đóng phí dài hạn 12 tháng
                        FlagKhuyenMaiDongTruoc = true;
                    }
                }
            }
            #endregion

            #region Tinh Khuyen mai thue bao
            if (!FlagKhuyenMaiDongTruoc)
            {
                if (KhachHangInfo != null && KhachHangInfo.CacKhuyenMai.Count > 0)
                {
                    if (KhachHangInfo.CacKhuyenMai[0].PhanTram > 0)
                    {
                        TienKhuyenMai = Math.Round((GiaTien * KhachHangInfo.CacKhuyenMai[0].PhanTram) / 100, 0);
                    }
                    else
                    {
                        TienKhuyenMai = KhachHangInfo.CacKhuyenMai[0].SoTien;
                    }
                    if (TienKhuyenMai > 0)
                    {
                        gvThe.Rows[row].Cells["KhuyenMaiId"].Value = KhachHangInfo.CacKhuyenMai[0].KhuyenMaiId;
                        gvThe.Rows[row].Cells["MoTa"].Value = KhachHangInfo.CacKhuyenMai[0].TenKhuyenMai;
                    }
                }
            }
            #endregion

            #region Tinh chiet khau sinh nhat va dong hon 12 the
            double TienKhuyenMaiSinhNhat = 0;
            if (!FlagKhuyenMaiDongTruoc)
            {
                if (KhachHangInfo.NgaySinh.Date.Month == DateTime.Now.Date.Month && SoLuongTheKhachHangDaThanhToan() >= 12)
                {
                    TienKhuyenMaiSinhNhat = Math.Round((GiaTien * KhuyenMaiSinhNhatVaDongMuoiHaiKy) / 100, 0);
                    //Kiem tra neu khach hang duoc huong cung mot luc 2 chinh sach khuyen mai thi khuyen mai nao co so tien lơn hon thi duoc huong
                    if (TienKhuyenMaiSinhNhat > TienKhuyenMai)
                    {
                        TienKhuyenMai = TienKhuyenMaiSinhNhat;
                        gvThe.Rows[row].Cells["MoTa"].Value = "Khuyến mãi sinh nhật và đã đóng tiền hơn 12 kỳ";
                        gvThe.Rows[row].Cells["KhuyenMaiId"].Value = 4;//KhuyenMaiId=4 Khuyến mãi cho học viên đóng tiền 12 kỳ trở lên
                    }
                }
            }
            #endregion

            gvThe.Rows[row].Cells["TienKhuyenMai"].Value= TienKhuyenMai;
            gvThe.Rows[row].Cells["ThanhTien"].Value= GiaTien - TienKhuyenMai;
        }

        private void btnLuuThe_Click(object sender, EventArgs e)
        {
             try
            {
                string Error = string.Empty;
                int indexforcus = 0;
                if (KiemTraCoDongThemMoi() || KiemTraCoDongChinhSua())
                {
                    if (KiemTraKhoiTaoThe(ref Error, ref  indexforcus))
                    {
                        try
                        {
                            #region Thực hiện
                            bool FlagThem = true;
                            bool FlagSua = true;
                            CSQLServer.BeginTran();
                            for (int i = 0; i < gvThe.Rows.Count; i++)
                            {
                                //Kiem tra the moi nhap
                                if (KiemTraMotDongThemMoi(i))
                                {
                                    if (clsUser.LayThongTinPhanQuyen("QuanLyTheHocVien").ChucNang.Them)
                                    {
                                        #region Thêm Thẻ
                                        clsTheDTO The = KhoiTaoThe(gvThe.Rows[i]);
                                        if (!new clsTheBUS().KiemTraTonTai(The.MaThe))
                                        {
                                            if (!new clsTheBUS().Them(ref The))
                                            {
                                                Error = " thêm vào cơ sở dữ liệu không thành công ";
                                                FlagThem = false;
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            Error = " Mã thẻ '" + The.MaThe + "' đã tồn tại trong hệ thống ";
                                            FlagThem = false;
                                            break;
                                        }
                                        #endregion
                                    }
                                    else
                                    {
                                        CSQLServer.RollBack();
                                        MessageBox.Show("Bạn không có quyền thêm mới thẻ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                        break;
                                    }
                                }
                                else
                                {
                                    if (clsUser.LayThongTinPhanQuyen("QuanLyTheHocVien").ChucNang.Sua)
                                    {
                                    #region Luu the
                                    if (KiemTraMotDongChinhSua(i))
                                    {
                                        clsTheDTO The = KhoiTaoThe(gvThe.Rows[i]);
                                        if (!new clsTheBUS().Sua(The))
                                        {
                                            FlagSua = false; 
                                            break;
                                        }
                                    }
                                    #endregion
                                    }
                                    else
                                    {
                                        CSQLServer.RollBack();
                                        MessageBox.Show("Bạn không có quyền chỉnh sửa thẻ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                        break;
                                    }
                                }
                            }

                            #region Thông báo
                            if (FlagThem && FlagSua)
                            {
                                CSQLServer.Commit();
                                gvThe.DataSource = new clsKhachHangBUS().LayBangThe(KhachHangInfo.KhachHangId);
                                GanCacTheChiChoPhepDoc();
                                KhachHangInfo.CacThe = new clsKhachHangBUS().LayDanhSachThe(KhachHangInfo.KhachHangId);
                                btnThemThe.Enabled = true;
                                MessageBox.Show("Lưu thẻ thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                if (!FlagThem && !FlagSua)
                                {
                                    MessageBox.Show("Thêm thẻ không thành công do không thêm được thẻ vào CSDL!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                else
                                {
                                    if (!FlagThem)
                                        MessageBox.Show("Thêm thẻ không thành công do " + Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    if (!FlagSua)
                                        MessageBox.Show("Lưu thẻ không thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                            }
                            #endregion

                            #endregion
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Thao tác không thành công do " + ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        //SetFocus(9);
                    }
                }
                else
                {
                    MessageBox.Show("Vui lòng thêm mới thẻ hoặc chỉnh sửa thẻ!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (Exception ex)
            { }
        }

        private void btnXoaThe_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                int dong = gvThe.CurrentRow.Index;
                 DialogResult result = MessageBox.Show("Bạn có thật sự muốn xóa thẻ không?", "Xác nhận thông tin", MessageBoxButtons.YesNo);
                 if (result == DialogResult.Yes)
                 {
                     if (KiemTraCoDongThemMoi())
                     {
                         string MaThe = gvThe.Rows[gvThe.CurrentRow.Index].Cells["MaThe"].Value.ToString();
                         gvThe.Rows.RemoveAt(dong);
                         btnThemThe.Enabled = true;
                         MessageBox.Show("Xóa Thẻ [" + MaThe + "] thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                     }
                     else
                     {
                         if (KiemTraTheXoa(ref Error))
                         {
                             decimal TheId = decimal.Parse(gvThe.Rows[dong].Cells["TheId"].Value.ToString());
                             string MaThe = gvThe.Rows[gvThe.CurrentRow.Index].Cells["MaThe"].Value.ToString();
                             if (new clsTheBUS().Xoa(TheId))
                             {
                                 gvThe.DataSource = new clsKhachHangBUS().LayBangThe(KhachHangInfo.KhachHangId);
                                 GanCacTheChiChoPhepDoc();
                                 KhachHangInfo.CacThe = new clsKhachHangBUS().LayDanhSachThe(KhachHangInfo.KhachHangId);
                                 btnThemThe.Enabled = true;
                                 MessageBox.Show("Xóa Thẻ [" + MaThe + "] thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                             }
                             else
                             {
                                 MessageBox.Show("Xóa Thẻ  [" + MaThe + "] ở dòng thứ " + dong.ToString() + " không thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                             }
                         }
                         else
                         {
                             MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                         }
                     }
                 }
            }
            catch (Exception ex)
            { }
        }

        private bool KiemTraTheXoa(ref string Error)
        {
            if (gvThe.CurrentRow.Index > -1)
            {
                decimal TheId;
                int dong=gvThe.CurrentRow.Index;
                if (gvThe.Rows[dong].Cells["TheId"].Value != null &&
                   !string.IsNullOrEmpty(gvThe.Rows[dong].Cells["TheId"].Value.ToString())
                   && decimal.TryParse(gvThe.Rows[dong].Cells["TheId"].Value.ToString(), out TheId)
                   && gvThe.Rows[dong].Cells["IsThuTien"].Value != null
                   && gvThe.Rows[dong].Cells["IsThuTien"].Value.ToString() == "Đã thu"
                   )
                {
                    Error = "Thẻ này đã thu tiền nên không cho phép xóa!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                Error="Vui lòng chọn vào dòng chứa thẻ muốn xóa!";
                return false;
            }
        }

        private void gvThe_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
                {
                    if (string.Equals(gvThe.Columns[e.ColumnIndex].Name, "NgayBatDau")
                       || string.Equals(gvThe.Columns[e.ColumnIndex].Name, "NgayKetThuc"))
                    {
                        DateTime NgayBatDau = DateTime.Parse(gvThe.Rows[e.RowIndex].Cells["NgayBatDau"].Value.ToString());
                        DateTime NgayKetThuc = DateTime.Parse(gvThe.Rows[e.RowIndex].Cells["NgayKetThuc"].Value.ToString());
                        TimeSpan tsTimeSpan = NgayKetThuc.Subtract(NgayBatDau);
                        TimeSpan tsTimeSpan1 = DateTime.Now.Subtract(NgayBatDau);
                        int SoNgay = tsTimeSpan.Days + 1;
                        int SoNgayhienhanh = tsTimeSpan1.Days;
                        if (SoNgay <= 0)
                        {
                            MessageBox.Show("Nhập ngày kết thúc phải lớn hơn ngày bắt đầu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else
                        {
                            if (SoNgayhienhanh < 0)
                            {
                                MessageBox.Show("Nhập bắt phải lơn hơn hoặc bằng ngày hiện hành!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else
                            {
                                CapNhatSoTienTheoNgayNhap(e.RowIndex, SoNgay);
                            }
                        }
                    }

                    //if (string.Equals(gvThe.Columns[e.ColumnIndex].Name, "GiaTien")
                    //    || string.Equals(gvThe.Columns[e.ColumnIndex].Name, "TienKhuyenMai"))
                    //{
                    //    double GiaTien;
                    //    if (double.TryParse(gvThe.Rows[e.RowIndex].Cells["GiaTien"].Value.ToString(), out GiaTien))
                    //    {
                    //        double TienKhuyenMai;
                    //        if (double.TryParse(gvThe.Rows[e.RowIndex].Cells["TienKhuyenMai"].Value.ToString(), out TienKhuyenMai))
                    //        {
                    //            gvThe.Rows[e.RowIndex].Cells["ThanhTien"].Value = GiaTien - TienKhuyenMai;
                    //        }
                    //    }
                    //}
                }
            }
            catch (Exception ex)
            {
            }
        }

        private Boolean KiemTraNgay(int row, ref string error)
        {
            DateTime NgayBatDau = DateTime.Parse(gvThe.Rows[row].Cells["NgayBatDau"].Value.ToString());
            DateTime NgayKetThuc = DateTime.Parse(gvThe.Rows[row].Cells["NgayKetThuc"].Value.ToString());
            TimeSpan tsTimeSpan = NgayBatDau.Subtract(NgayKetThuc);
            TimeSpan tsTimeSpan1 = NgayBatDau.Subtract(DateTime.Now);
            int SoNgay = tsTimeSpan.Days;
            int SoNgayhienhanh = tsTimeSpan1.Days;
            if (SoNgay <= 0)
            {
                error = "Nhập ngày kết thúc phải lớn hơn ngày bắt đầu!";
                return false;
            }
            else
            {
                if (SoNgayhienhanh < 0)
                {
                    error = "Nhập bắt phải lơn hơn hoặc bằng ngày hiện hành!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }

        #endregion

    }
}
